//
//  NSData+TYCompress.h
//  TYFoundation
//
//  Created by 郭艺伟 on 2019/2/28.
//

#import <Foundation/Foundation.h>

#warning 引入lib Z库

#if __has_include("zlib.h")
#import <zlib.h>
#endif

/**
 ### Constants
 `TYzipZlibErrorDomain` GZip压缩错误.
 */
extern NSString * const TYzipZlibErrorDomain;

@interface NSData (TYCompress)

/**
 *    使用当前实例进行gzip压缩
 *
 *    @param error 压缩过程中产生错误
 *
 *    @return gzip后的数据
 */
- (NSData *)ty_dataByGZipCompressingWithError:(NSError * __autoreleasing *)error;

/**
 *    使用特定zlib值（压缩等级、内存窗口缓存、全局内存等级、压缩策略）对当前实例进行gzip压缩
 *
 *    @param level      压缩等级，必须为Z_DEFAULT_COMPRESSION或者从0到9（1最快速度，9最大压缩，0不进行任何压缩）。Z_DEFAULT_COMPRESSION（等效等级6）兼顾速度与压缩率
 *    @param windowBits 历史内存缓存，值越大将会使用越多内存进行压缩
 *    @param memLevel   全局内存等级，1为使用最少缓存但减慢压缩速度与压缩比，9为优化速度使用最大内存。默认值为8
 *    @param strategy   压缩算法策略选择，正常数据使用Z_DEFAULT_STRATEGY，过滤器或者指标使用Z_FILTERED，强制只使用哈弗曼编码使用Z_HUFFMAN_ONLY，使用Z_RLE限制匹配长度
 *    @param error      压缩过程中产生错误
 *
 *    @return gzip后的数据
 */
- (NSData *)ty_dataByGZipCompressingAtLevel:(int)level
                                  windowSize:(int)windowBits
                                 memoryLevel:(int)memLevel
                                    strategy:(int)strategy
                                       error:(NSError * __autoreleasing *)error;

/**
 *    对当前实例进行gzpi解压缩
 *
 *    @param error 解压缩过程中产生错误
 *
 *    @return gzip解压后的数据
 */
- (NSData *)ty_dataByGZipDecompressingDataWithError:(NSError * __autoreleasing *)error;

/**
 *    对当前实例使用内存缓存大小进行gzpi解压缩
 *
 *    @param windowBits 与压缩参数一致
 *    @param error      解压缩过程中产生错误
 *
 *    @return gzip解压后的数据
 */
- (NSData *)ty_dataByGZipDecompressingDataWithWindowSize:(int)windowBits
                                                    error:(NSError * __autoreleasing *)error;


@end
